import java.util.LinkedList;
import java.util.Queue;

// 使用两个队列实现栈的类
class MyStackUseQueue {

    // 定义两个队列作为成员变量
    public Queue<Integer> primaryQueue;  // 主队列，用于主要存储元素
    public Queue<Integer> secondaryQueue; // 辅助队列，用于临时转移元素

    // 构造函数，初始化两个队列为LinkedList实例（LinkedList实现了Queue接口）
    public MyStackUseQueue() {
        primaryQueue = new LinkedList<>();
        secondaryQueue = new LinkedList<>();
    }

    // 将元素压入栈顶
    // 方法：确保所有元素始终只在一个队列中存储，另一个队列用于操作时的临时转移
    public void push(int x) {
        // 优先将元素添加到非空的队列中
        if (!primaryQueue.isEmpty()) {
            primaryQueue.offer(x); // 主队列不为空，直接添加
        } else if (!secondaryQueue.isEmpty()) {
            secondaryQueue.offer(x); // 次队列不为空，添加到次队列
        } else {
            // 两个队列都为空时，默认添加到主队列
            primaryQueue.offer(x);
        }
    }

    // 弹出栈顶元素（移除并返回）
    // 方法：将当前非空队列的前 n-1 个元素转移到辅助队列，剩余最后一个元素即为栈顶，弹出并返回
    public int pop() {
        if (empty()) {
            return -1; // 栈为空，返回-1（实际应用中可能需要异常处理）
        }

        // 判断当前元素存储在哪个队列
        if (!primaryQueue.isEmpty()) {
            // 主队列非空，将前size-1个元素转移到辅助队列
            int size = primaryQueue.size();
            for (int i = 0; i < size - 1; i++) {
                int val = primaryQueue.poll();
                secondaryQueue.offer(val);
            }
            // 最后剩下的元素就是栈顶，弹出并返回
            return primaryQueue.poll();
        } else {
            // 次队列非空，同样处理
            int size = secondaryQueue.size();
            for (int i = 0; i < size - 1; i++) {
                int val = secondaryQueue.poll();
                primaryQueue.offer(val);
            }
            return secondaryQueue.poll();
        }
    }

    // 返回栈顶元素（不弹出）
    // 方法：类似 pop()，但需要转移所有元素 并记录最后一个元素的值，最后所有元素转移到辅助队列。
    public int top() {
        if (empty()) {
            return -1; // 栈为空，返回-1
        }

        int val = -1;
        // 根据当前活跃队列转移元素
        if (!primaryQueue.isEmpty()) {
            int size = primaryQueue.size();
            for (int i = 0; i < size; i++) {
                val = primaryQueue.poll(); // 逐个取出元素
                secondaryQueue.offer(val); // 转移到辅助队列
            }
            // 最后一次的val即为栈顶元素
        } else {
            int size = secondaryQueue.size();
            for (int i = 0; i < size; i++) {
                val = secondaryQueue.poll();
                primaryQueue.offer(val);
            }
        }
        return val;
    }

    // 判断栈是否为空
    public boolean empty() {
        // 两个队列都为空时栈为空
        return primaryQueue.isEmpty() && secondaryQueue.isEmpty();
    }
}






